#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import asyncio
from typing import List

from agentscope.agent import AgentBase
from agentscope.message import Msg
from agentscope.model import DashScopeChatModel
from agentscope.formatter import DashScopeChatFormatter
from agentscope.memory import InMemoryMemory

from src.utils.env_config import aliyun_model_config


class PolicyEvaluatorAgent(AgentBase):
    """T6 - 政策影响评估智能体"""

    def __init__(self):
        super().__init__()
        self.name = "PolicyEvaluatorAgent"
        self.sys_prompt = """你是一个政策影响评估智能体。你的任务是分析文献中提及的政策法规对相关技术领域的影响。
        要求：
        1. 基于检索摘要中提到的政策、法规或监管动向，提炼其核心内容；
        2. 分析该政策对技术研发、市场准入、企业合规等方面的影响；
        3. 内容长度不少于80字；
        4. 语言正式、中立，体现政策解读的专业性；
        5. 不得虚构未提及的政策文件；
        6. 输出格式必须为JSON，仅包含一个字段"policy_impact"，值为字符串；
        7. 不要解释过程，不要添加额外内容。
        示例输出：
        {
        "policy_impact": "欧盟于2025年7月实施《AI透明度法案》，要求所有高风险AI系统提供可解释性报告。
        该政策将推动企业加强模型审计能力，短期内增加合规成本，长期有助于提升公众信任，促进AI技术的健康发展。"
        }"""

        self.model = DashScopeChatModel(
            model_name=aliyun_model_config["model_name"],
            api_key=aliyun_model_config["api_key"],
            stream=False
        )
        self.formatter = DashScopeChatFormatter()
        self.memory = InMemoryMemory()

    async def reply(self, msg: Msg) -> Msg:
        """处理政策影响评估请求"""
        await self.memory.add(msg)

        # 准备提示
        prompt = await self.formatter.format([
            Msg("system", self.sys_prompt, "system"),
            msg
        ])

        # 调用模型
        response = await self.model(prompt)

        # 创建回复消息
        reply_msg = Msg(
            name=self.name,
            content=response.content,
            role="assistant"
        )

        await self.memory.add(reply_msg)
        return reply_msg

    async def evaluate_policy_impact(self, retrieval_summary: str, keywords: List[str], abstract: str = None) -> str:
        """
        分析文献中提及的政策法规对相关技术领域的影响
        Args:
            retrieval_summary: 来自T2的检索结果摘要
            keywords: 来自T1的关键词列表
            abstract: 来自T3的摘要（可选）
        Returns:
            str: 政策影响评估结果
        """
        # 构建用户输入
        user_content = f"现在开始处理：\n检索结果摘要：{retrieval_summary}\n关键词列表：{keywords}"
        
        if abstract:
            user_content += f"\n摘要内容：{abstract}"

        user_msg = Msg(
            name="user",
            content=user_content,
            role="user"
        )

        response_msg = await self.reply(user_msg)
        
        try:
            # 提取文本内容
            content_text = ""
            if isinstance(response_msg.content, list):
                for block in response_msg.content:
                    if hasattr(block, 'text'):
                        content_text += block.text
                    elif isinstance(block, dict) and 'text' in block:
                        content_text += block['text']
            else:
                content_text = str(response_msg.content)

            result = json.loads(content_text)
            policy_impact = result.get("policy_impact", "")

            return policy_impact
            
        except json.JSONDecodeError:
            print(f"JSON解析失败:{response_msg.content}")
            return ""

    def should_trigger(self, retrieval_summary: str) -> bool:
        """
        判断是否需要触发政策影响评估
        Args:
            retrieval_summary: 检索结果摘要
        Returns:
            bool: 是否需要执行T6任务
        """
        policy_keywords = ["政策法规", "监管", "合规", "立法", "法案", "条例", "规定", "政策", "法律"]
        # 检查是否包含政策相关关键词
        for keyword in policy_keywords:
            if keyword in retrieval_summary:
                return True
        
        return False

    async def observe(self, msg: Msg) -> None:
        """观察消息"""
        await self.memory.add(msg)

    async def handle_interrupt(self) -> Msg:
        """处理中断"""
        return Msg(
            name=self.name,
            content="政策影响评估任务被中断",
            role="assistant"
        )


# 测试代码
async def test_policy_evaluator():
    """测试政策影响评估智能体"""
    agent = PolicyEvaluatorAgent()
    
    # 测试数据
    test_retrieval_summary = """
    2025年Q3，欧盟正式实施《人工智能法案》，对高风险AI系统提出严格的透明度和可解释性要求。
    该法案要求企业在部署AI系统前必须进行风险评估，并建立完善的监管合规体系。
    同时，中国也在加快推进AI相关立法工作，预计年内将出台相应的监管政策。
    """
    
    test_keywords = ["AI", "人工智能", "政策", "法规", "监管"]
    
    # 测试触发条件
    should_trigger = agent.should_trigger(test_retrieval_summary)
    print(f"是否触发政策评估: {should_trigger}")
    
    if should_trigger:
        # 执行政策影响评估
        result = await agent.evaluate_policy_impact(test_retrieval_summary, test_keywords)
        print(f"政策影响评估结果: {result}")


if __name__ == "__main__":
    asyncio.run(test_policy_evaluator())